package fluxo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;
import javax.swing.JTextPane;

public class Cliente extends Thread {

	// Flag que indica quando se deve terminar a execução.
	private static boolean done = false;
	private Socket conexao;
	private PrintStream saida;
	private JTextPane pane;

	// construtor que recebe o socket deste cliente
	public Cliente(Socket s, String nome, JTextPane pane) {
		conexao = s;
		this.pane = pane;
		try {
			// uma vez estabelecida a comunicação, deve-se obter os
			// objetos que permitem controlar o fluxo de comunicação
			saida = new PrintStream(conexao.getOutputStream());
			// enviar antes de tudo o nome do usuário
			saida.println(nome);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// Caso ocorra alguma excessão de E/S, mostre qual foi.
			System.out.println("IOException: " + e);
		}

	}

	// execução da thread
	public void run() {
		try {
			BufferedReader entrada = new BufferedReader(new InputStreamReader(
					conexao.getInputStream()));
			String linha;
			while (true) {
				// pega o que o servidor enviou
				linha = entrada.readLine();
				// verifica se é uma linha válida. Pode ser que a conexão
				// foi interrompida. Neste caso, a linha é null. Se isso
				// ocorrer, termina-se a execução saindo com break
				if (linha == null) {
					System.out.println("Conexão encerrada!");
					break;
				}
				// caso a linha não seja nula, deve-se imprimi-la no textPane
				pane.setText(pane.getText() + "\n" + linha);
			}
		} catch (IOException e) {
			// caso ocorra alguma exceção de E/S, mostrar qual foi.
			System.out.println("IOException: " + e);
		}
		// sinaliza para o main que a conexão encerrou.
		done = true;
	}

	public void sendMessage(String message) {
		// enviando-a para o servidor.
		String linha = message;
		// antes de enviar, verifica se a conexão não foi fechada
		if (done) {
			JOptionPane.showMessageDialog(null, "Conexão Encerrada");
		} else {
			// envia para o servidor
			saida.println(linha);
		}
	}
}
